package util.queue;

import java.lang.reflect.Array;

/**
 * @author Huzz
 * @created 2021-10-18
 * @param <T>
 */
public class ArrayQueue<T> {

    private static final int DEFAULT_SIZE = 128;

    /**
     * 用于保存队列元素的数组
     */
    private T[] dataArray;

    /**
     * 队列长度
     */
    private int size;
    /**
     * 最大长度
     */
    private int length;

    /**
     * 构造方法-初始化队列
     * @param type 队列数据类型
     * @param size 队列长度，默认128
     */
    public ArrayQueue(Class<T> type, int size) {
        dataArray = (T[]) Array.newInstance(type, size);
        this.size = 0;
        length = size;
    }

    /**
     * 构造方法-初始化队列
     * @param type 队列数据类型
     */
    public ArrayQueue(Class<T> type) {
        this(type, DEFAULT_SIZE);
    }

    /**
     * 入队
     *
     * @param val
     */
    public void add(T val) {
        dataArray[size++] = val;
    }

    /**
     * 返回队首元素
     *
     * @return
     */
    public T getFirst() {
        return dataArray[0];
    }

    /**
     * 出队
     *
     * @return
     */
    public T pop() {
        T ret = dataArray[0];
        size--;
        for (int i = 1; i <= size; i++) {
            dataArray[i - 1] = dataArray[i];
        }
        return ret;
    }

    /**
     * 长度
     *
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 队列长度
     * @return
     */
    public int length(){
        return length;
    }

}